Introduction

Resolving geographic units that do not neatly coincide is a common problem in spatial data analysis. This method attempts to conflate King County Health Reporting Areas (HRAs) to US Census tracts. In the cases where a given tract with entirely within a HRA, that tract receives the HRA’s ID. Where a given tract overlaps multiple HRAs block-level census data is used to determine which HRA ID to assign to the tract.

Census Block Counts

This method provides three alternatives of block-level counts that can be used:

The Algorithm

The following actions are performed in this method:

  1. Centroids of the census block polygons are calculated (class = SpatialPointsDataFrame)
  2. HRA IDs are passed to the block centroid using a spatial overlay method (sp::over())
  3. Blocks are aggregated into tracts and the count variables (POP,HU,POPHU) are summed
  4. For each count variable, the HRA ID with the highest sum is assigned to each tract
The following named parsers don't match the column names: GEO.id2The following named parsers don't match the column names: GEO.id2The following named parsers don't match the column names: GEO.id2

Maps

LS0tCmRmX3ByaW50OiB0aWJibGUKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCmFsd2F5c19hbGxvd19odG1sOiB5ZXMKLS0tCgpgYGB7ciBocmEtdHItc2V0dXAsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGNvbW1lbnQ9RkFMU0V9CmxpYnJhcnkocGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShycHJvanJvb3QpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJnZGFsKQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KG1pc2NnaXMpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShkb3dubG9hZGVyKQpsaWJyYXJ5KHdlYnNob3QpCmxpYnJhcnkoaHRtbHRvb2xzKQpsaWJyYXJ5KGdwbG90cykKbGlicmFyeShnZ21hcCkKbGlicmFyeShzaGlueSkKbGlicmFyeShodG1sd2lkZ2V0cykKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoYWNzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKcm9vdCA8LSBycHJvanJvb3Q6OmlzX3JzdHVkaW9fcHJvamVjdApyb290X2ZpbGUgPC0gcm9vdCRtYWtlX2ZpeF9maWxlKCkKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgY29tbWVudD1GQUxTRSkKYGBgCgojIyMgSW50cm9kdWN0aW9uClJlc29sdmluZyBnZW9ncmFwaGljIHVuaXRzIHRoYXQgZG8gbm90IG5lYXRseSBjb2luY2lkZSBpcyBhIGNvbW1vbiBwcm9ibGVtIGluIHNwYXRpYWwgZGF0YSBhbmFseXNpcy4gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gY29uZmxhdGUgS2luZyBDb3VudHkgSGVhbHRoIFJlcG9ydGluZyBBcmVhcyAoSFJBcykgdG8gVVMgQ2Vuc3VzIHRyYWN0cy4gSW4gdGhlIGNhc2VzIHdoZXJlIGEgZ2l2ZW4gdHJhY3Qgd2l0aCBlbnRpcmVseSB3aXRoaW4gYSBIUkEsIHRoYXQgdHJhY3QgcmVjZWl2ZXMgdGhlIEhSQSdzIElELiBXaGVyZSBhIGdpdmVuIHRyYWN0IG92ZXJsYXBzIG11bHRpcGxlIEhSQXMgYmxvY2stbGV2ZWwgY2Vuc3VzIGRhdGEgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggSFJBIElEIHRvIGFzc2lnbiB0byB0aGUgdHJhY3QuIAoKCiMjIyBDZW5zdXMgQmxvY2sgQ291bnRzClRoaXMgbWV0aG9kIHByb3ZpZGVzIHRocmVlIGFsdGVybmF0aXZlcyBvZiBibG9jay1sZXZlbCBjb3VudHMgdGhhdCBjYW4gYmUgdXNlZDoKCiAgKiBQb3B1bGF0aW9uCiAgKiBIb3VzaW5nIFVuaXRzCiAgKiBQb3B1bGF0aW9uIGluIEhvdXNpbmcgVW5pdHMKICAKCmBgYHtyIGhyYS10ci1ibGtzfQoKaWYoIWZpbGUuZXhpc3RzKHJvb3RfZmlsZSgnMS1kYXRhLzQtaW50ZXJpbS9rYy1ibGstc3AuZ3BrZycpKSl7CiAgICAgICAgcG9wIDwtIHJlYWRfY3N2KHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL3dhLWJsay9ERUNfMTBfU0YxX1AxL0RFQ18xMF9TRjFfUDFfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFIgPSBzdWJzdHIoSWQyLHN0YXJ0ID0gMSxzdG9wID0gMTEpLAogICAgICAgICAgICAgICAgICAgICAgIFBPUCA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxHRU9JRF9UUixQT1ApCiAgICAgICAgCiAgICAgICAgaHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEvREVDXzEwX1NGMV9IMV93aXRoX2Fubi5jc3YnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKEdFT19JRF9CTEsgPSBJZDIsCiAgICAgICAgICAgICAgICAgICAgICAgSFUgPSBUb3RhbCkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT19JRF9CTEssSFUpCiAgICAgICAgCiAgICAgICAgcG9waHUgPC0gcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvd2EtYmxrL0RFQ18xMF9TRjFfSDEwL0RFQ18xMF9TRjFfSDEwX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSAlPiUgCiAgICAgICAgICAgICAgICBtdXRhdGUoR0VPX0lEX0JMSyA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFRvdGFsKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPX0lEX0JMSyxQT1BIVSkKICAgICAgICAKICAgICAgICBjbnRzIDwtIGxlZnRfam9pbihwb3AsaHUsYnkgPSAnR0VPX0lEX0JMSycpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbihwb3BodSxieSA9ICdHRU9fSURfQkxLJykKICAgICAgICAKICAgICAgICAjIFNvdXJjZSBmb3IgS0MgQmxvY2tzIHNwYXRpYWwgZGF0YQogICAgICAgIGlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC9ibG9ja3MxMC5zaHAnKSkpewogICAgICAgICAgICAgICAgdXJsIDwtICdmdHA6Ly9mdHAua2luZ2NvdW50eS5nb3YvZ2lzLXdlYi93ZWIvR0lTRGF0YS9ibG9ja3MxMF9TSFAuemlwJyAjIGRpcmVjdCBVUkwgdG8gdGhlIGZpbGUgZG93bmxvYWQKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGVtcCA8LSB0ZW1wZmlsZSgpICMgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gaG9sZCB0aGUgY29tcHJlc3NlZCBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBkb3dubG9hZCh1cmwsIGRlc3QgPSB0ZW1wLCBtb2RlPSd3YicpICMgZG93bmxvYWQgdGhlIGZpbGUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdW56aXAgKHRlbXAsIGV4ZGlyID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC93YS1ibGsnKSkgIyBleHRyYWN0IHRoZSBmaWxlIHRvIHRoZSBwcm9qZWN0IGZvbGRlcgogICAgICAgIH0KICAgICAgICAKICAgICAgICBrY19ibGsgPC0gcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL3dhLWJsay9ibG9ja3MxMC8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdibG9ja3MxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICAgICAgICAKICAgICAgICBrY19ibGtAZGF0YSAlPD4lIGxlZnRfam9pbihjbnRzLCBieSA9ICdHRU9fSURfQkxLJykgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX0JMSyA9IEdFT19JRF9CTEssCiAgICAgICAgICAgICAgICAgICAgICAgR0VPSURfVFI6UE9QSFUpCiAgICAgICAgCiAgICAgICAga2NfYmxrICU+JSB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtYmxrLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2Jsa19zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFLHZlcmJvc2UgPSBGQUxTRSkKfQoKa2NfYmxrX3NwIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWJsay1zcC5ncGtnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICdrY19ibGtfc3AnLAogICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKCgoKYGBgCgoKIyMjIFRoZSBBbGdvcml0aG0gClRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoaXMgbWV0aG9kOgoKICAxLiBDZW50cm9pZHMgb2YgdGhlIGNlbnN1cyBibG9jayBwb2x5Z29ucyBhcmUgY2FsY3VsYXRlZCAoYGNsYXNzID0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZWApCiAgMi4gSFJBIElEcyBhcmUgcGFzc2VkIHRvIHRoZSBibG9jayBjZW50cm9pZCB1c2luZyBhIHNwYXRpYWwgb3ZlcmxheSBtZXRob2QgKGBzcDo6b3ZlcigpYCkKICAzLiBCbG9ja3MgYXJlIGFnZ3JlZ2F0ZWQgaW50byB0cmFjdHMgYW5kIHRoZSBjb3VudCB2YXJpYWJsZXMgKGBQT1BgLGBIVWAsYFBPUEhVYCkgYXJlIHN1bW1lZAogIDQuIEZvciBlYWNoIGNvdW50IHZhcmlhYmxlLCB0aGUgSFJBIElEIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGlzIGFzc2lnbmVkIHRvIGVhY2ggdHJhY3QKICAKYGBge3IgaHJhLWFzc2lnbn0KCiMgUGFzcyBIUkEgSURzIHRvIHRoZSBibG9jayBjZW50cm9pZHMKaHJhIDwtIHJlYWRPR1IoZHNuID0gcm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwvSFJBXzIwMTBCbG9ja19DbGlwLycpLGxheWVyID0gJ0hSQV8yMDEwQmxvY2tfQ2xpcCcsCiAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgprY19ibGtfY250X3NwIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoY29vcmRzID0gcmdlb3M6OmdDZW50cm9pZChrY19ibGtfc3AsYnlpZCA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGFzLmRhdGEuZnJhbWUoa2NfYmxrX3NwQGRhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2guSUQgPSBGQUxTRSkKCmtjX2Jsa19jbnRfc3AkSFJBX0lEIDwtIHNwOjpvdmVyKGtjX2Jsa19jbnRfc3AsaHJhWywnSFJBMjAxMHYyXyddKSAlPiUgdW5saXN0CgprY19ibGtfY250X3NwQGRhdGEgJTw+JSBtdXRhdGUoSFJBX0lEID0gaWZlbHNlKGlzLm5hKEhSQV9JRCksJ05vbmUnLEhSQV9JRCkpCgoKIyBBc3NpZ24gSFJBcyB0byB0cmFjdHMKIAppZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvNC1pbnRlcmltL2tjLWhyYS10ci1zcC5ncGtnJykpKXsKICAgICAgICBpZighZmlsZS5leGlzdHMocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9rYy10ci90cmFjdHMxMF9zaG9yZS90cmFjdHMxMF9zaG9yZS5zaHAnKSkpewogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1cmwgPC0gJ2Z0cDovL2Z0cC5raW5nY291bnR5Lmdvdi9naXMtd2ViL3dlYi9HSVNEYXRhL3RyYWN0czEwX3Nob3JlX1NIUC56aXAnICMgZGlyZWN0IFVSTCB0byB0aGUgZmlsZSBkb3dubG9hZAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0ZW1wIDwtIHRlbXBmaWxlKCkgIyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBob2xkIHRoZSBjb21wcmVzc2VkIGRvd25sb2FkCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRvd25sb2FkKHVybCwgZGVzdCA9IHRlbXAsIG1vZGU9J3diJykgIyBkb3dubG9hZCB0aGUgZmlsZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB1bnppcCAodGVtcCwgZXhkaXIgPSByb290X2ZpbGUoJzEtZGF0YS8zLWV4dGVybmFsL2tjLXRyJykpICMgZXh0cmFjdCB0aGUgZmlsZSB0byB0aGUgcHJvamVjdCBmb2xkZXIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAKICAgICAgICBrY190cl9zcCA8LSByZWFkT0dSKGRzbiA9IHJvb3RfZmlsZSgnMS1kYXRhLzMtZXh0ZXJuYWwva2MtdHIvdHJhY3RzMTBfc2hvcmUvJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllciA9ICd0cmFjdHMxMF9zaG9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgICAgICAga2NfdHJfc3BAZGF0YSAlPD4lIHNlbGVjdChHRU9JRF9UUiA9IEdFT19JRF9UUlQpCiAgICAgICAgCiAgICAgICAgZmlyc3Rfbm90TkEgPC0gZnVuY3Rpb24oeCl7Zmlyc3QoeFshaXMubmEoeCldKX0KICAgICAgICAKICAgICAgICB0cl9ocmFfaWRzIDwtIAogICAgICAgICAgICAgICAga2NfYmxrX2NudF9zcEBkYXRhICU+JSAKICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICAgICAgICAgICAgICBnYXRoZXIoJ1ZBUicsJ0NPVU5UJyxQT1A6UE9QSFUpICU+JSAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSLFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShTVU0gPSBzdW0oQ09VTlQpKSAlPiUgCiAgICAgICAgICAgICAgICBhcnJhbmdlKGRlc2MoU1VNKSkgJT4lIAogICAgICAgICAgICAgICAgc2xpY2UoMSkgJT4lIAogICAgICAgICAgICAgICAgc3ByZWFkKFZBUixIUkFfSUQpICU+JSAKICAgICAgICAgICAgICAgIG11dGF0ZShIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKEhVKSxTVU0sTkFfaW50ZWdlcl8pLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUCksU1VNLE5BX2ludGVnZXJfKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9DTlQgPSBpZmVsc2UoIWlzLm5hKFBPUEhVKSxTVU0sTkFfaW50ZWdlcl8pKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoLVNVTSkgJT4lIAogICAgICAgICAgICAgICAgZ3JvdXBfYnkoR0VPSURfVFIpICU+JSAKICAgICAgICAgICAgICAgIHN1bW1hcmlzZV9hbGwoZnVucyhmaXJzdF9ub3ROQSkpICU+JSAKICAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QID0gUE9QX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIVSA9IEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSA9IFBPUEhVX0NOVCwKICAgICAgICAgICAgICAgICAgICAgICBIUkFfUE9QID0gUE9QLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9IVSA9IEhVLAogICAgICAgICAgICAgICAgICAgICAgIEhSQV9QT1BIVSA9IFBPUEhVKQogICAgICAgIAogICAgICAgIHRyX2hyYV9pZHMyIDwtIAogICAgICAgICAgICAgICAgdHJfaHJhX2lkcyAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsbWF0Y2hlcygnSFJBJykpICU+JSAKICAgICAgICAgICAgICAgIGdhdGhlcigiVkFSIiwiSFJBIixtYXRjaGVzKCdIUkEnKSkgJT4lICAKICAgICAgICAgICAgICAgIGdyb3VwX2J5KEdFT0lEX1RSKSAlPiUgCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoQUxMRVEgPSBsZW5ndGgodW5pcXVlKEhSQSkpPT0xKSAlPiUKICAgICAgICAgICAgICAgIGxlZnRfam9pbih0cl9ocmFfaWRzLC4sYnkgPSAnR0VPSURfVFInKSAKICAgICAgICAKICAgICAgICAjIEdldCB0aGUgcGVyY2VudGFnZSBmb3IgZWFjaCBjb3VudCB2YXJpYWJsZQogICAgICAgIAogICAgICAgIHBvcF90ciA8LSAKICAgICAgICAgICAgICAgIHJlYWRfY3N2KHJvb3RfZmlsZSgiMS1kYXRhLzMtZXh0ZXJuYWwvbWFudWFsL2tjLXRyL0RFQ18xMF9TRjFfUDEvREVDXzEwX1NGMV9QMV93aXRoX2Fubi5jc3YiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKEdFTy5pZDIgPSBjb2xfY2hhcmFjdGVyKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9ncmFwaHkgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQgPSBjb2xfc2tpcCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWQyID0gY29sX2NoYXJhY3RlcigpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMSkgJT4lIAogICAgICAgICAgICAgICAgc2VsZWN0KEdFT0lEX1RSID0gSWQyLAogICAgICAgICAgICAgICAgICAgICAgIFBPUF9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMS9ERUNfMTBfU0YxX0gxX3dpdGhfYW5uLmNzdicpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHMoR0VPLmlkMiA9IGNvbF9jaGFyYWN0ZXIoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlb2dyYXBoeSA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZCA9IGNvbF9za2lwKCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZDIgPSBjb2xfY2hhcmFjdGVyKCkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIHBvcGh1X3RyIDwtIAogICAgICAgICAgICAgICAgcmVhZF9jc3Yocm9vdF9maWxlKCcxLWRhdGEvMy1leHRlcm5hbC9tYW51YWwva2MtdHIvREVDXzEwX1NGMV9IMTAvREVDXzEwX1NGMV9IMTBfd2l0aF9hbm4uY3N2JyksIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhHRU8uaWQyID0gY29sX2NoYXJhY3RlcigpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VvZ3JhcGh5ID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkID0gY29sX3NraXAoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkMiA9IGNvbF9jaGFyYWN0ZXIoKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDEpICU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChHRU9JRF9UUiA9IElkMiwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9UUiA9IFRvdGFsKQogICAgICAgIAogICAgICAgIGtjX3RyX3NwQGRhdGEgJTw+JQogICAgICAgICAgICAgICAgbGVmdF9qb2luKC4sdHJfaHJhX2lkczIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixwb3BfdHIsYnkgPSAnR0VPSURfVFInKSAlPiUgCiAgICAgICAgICAgICAgICBsZWZ0X2pvaW4oLixodV90cixieSA9ICdHRU9JRF9UUicpICU+JSAKICAgICAgICAgICAgICAgIGxlZnRfam9pbiguLHBvcGh1X3RyLGJ5ID0gJ0dFT0lEX1RSJykgJT4lIAogICAgICAgICAgICAgICAgbXV0YXRlKFBPUF9QQ1QgPSByb3VuZF9hbnkoUE9QL1BPUF9UUixhY2N1cmFjeSA9IC4wMSksCiAgICAgICAgICAgICAgICAgICAgICAgSFVfUENUID0gcm91bmRfYW55KEhVL0hVX1RSLGFjY3VyYWN5ID0gLjAxKSwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVV9QQ1QgPSByb3VuZF9hbnkoUE9QSFUvUE9QSFVfVFIsYWNjdXJhY3kgPSAuMDEpKSAlPiUgCiAgICAgICAgICAgICAgICBzZWxlY3QoR0VPSURfVFIsCiAgICAgICAgICAgICAgICAgICAgICAgUE9QLFBPUF9QQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgSFUsIEhVX1BDVCwKICAgICAgICAgICAgICAgICAgICAgICBQT1BIVSwgUE9QSFVfUENULGV2ZXJ5dGhpbmcoKSkKICAgICAgICAKICAgICAgICBrY190cl9zcCAlPiUgCiAgICAgICAgICAgICAgICB3cml0ZU9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgPSAnR1BLRycsCiAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyd3JpdGVfbGF5ZXIgPSBUUlVFKQogICAgICAgIAp9CgprY19ocmFfdHJfc3AgPC0gCiAgICAgICAgcmVhZE9HUihkc24gPSByb290X2ZpbGUoJzEtZGF0YS80LWludGVyaW0va2MtaHJhLXRyLXNwLmdwa2cnKSwKICAgICAgICAgICAgICAgIGxheWVyID0gJ2tjX2hyYV90cl9zcCcsCiAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UpICU+JSAKICAgICAgICBzcFRyYW5zZm9ybShjcnNfcHJvaikKCmBgYAoKIyMjIE1hcHMKCgpgYGB7ciBocmEtbWFwc30KCm15cGFsIDwtIFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg4LG5hbWUgPSAnU2V0MicpWy04XQoKc2h1ZmZsZWRfaHJhIDwtIGZjdF9zaHVmZmxlKGtjX2hyYV90cl9zcCRIUkFfUE9QKSAlPiUgZmFjdG9yKG9yZGVyZWQgPSBUKQoKcGFsIDwtIGNvbG9yRmFjdG9yKHBhbGV0dGUgPSBteXBhbCxkb21haW4gPSBzaHVmZmxlZF9ocmEpCgpocmEgJTw+JSBzcFRyYW5zZm9ybShjcnNfcHJvaikKCmhyYV9wb3B1cCA8LSBwYXN0ZTAoa2NfaHJhX3RyX3NwJEhSQV9QT1ApCgpzaG93X2hyYV90ciA8LSBmdW5jdGlvbigpewogICAgICAgIG15TGZsdEdyZXkoYnVtcExhYmVscyA9IEZBTFNFLGhpZGVDb250cm9scyA9IEZBTFNFKSAlPiUKICAgICAgICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRDYXJ0b0RCKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGtjX2hyYV90cl9zcCwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2wyaGV4KCJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAuODUsCiAgICAgICAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChzaHVmZmxlZF9ocmEpLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjUsCiAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAnSFJBIFRyYWN0IGJ5IFBvcC4nLAogICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfnBhc3RlMChrY19ocmFfdHJfc3AkR0VPSURfVFIpKSAlPiUgCiAgICAgICAgYWRkUG9seWdvbnMoZGF0YSA9IGhyYSwKICAgICAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLAogICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMCwKICAgICAgICAgICAgICAgICAgICB3ZWlnaHQgPSAyLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gfnBhbChmYWN0b3IoaHJhJEhSQTIwMTB2Ml8sbGV2ZWxzID0gbGV2ZWxzKHNodWZmbGVkX2hyYSksb3JkZXJlZCA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICAgICAgICBncm91cCA9ICdIUkFzJywKICAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5wYXN0ZTAoaHJhJEhSQTIwMTB2Ml8pKSAlPiUgCiAgICAgICAgYWRkTGF5ZXJzQ29udHJvbChvdmVybGF5R3JvdXBzID0gYygnSFJBIFRyYWN0IGJ5IFBvcC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSQXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gJ3RvcHJpZ2h0JyxvcHRpb25zID0gbGF5ZXJzQ29udHJvbE9wdGlvbnMoRkFMU0UpKQp9CgojIFNhdmUgYW4gSFRNTCB2ZXJzaW9uIG9mIHRoZSBtYXAKCmlmKCFmaWxlLmV4aXN0cyhyb290X2ZpbGUoJzMtY29tbXVuaWNhdGlvbi9vdGhlcnMvaHRtbC9ocmEtdHJhY3RzLmh0bWwnKSkpewogICAgICAgIHNob3dfaHJhX3RyKCkgJT4lIAogICAgICAgIHNhdmVXaWRnZXQoZmlsZSA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2hyYS10cmFjdHMuaHRtbCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmY29udGFpbmVkID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmRpciA9IHJvb3RfZmlsZSgnMy1jb21tdW5pY2F0aW9uL290aGVycy9odG1sL2h0bWxfc3VwcG9ydF9maWxlcycpKQp9CgpzaG93X2hyYV90cigpCgoKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK